package com.server.service.data;

import java.util.List;

import com.client.service.data.AssureDataService;
import com.google.appengine.api.datastore.EntityNotFoundException;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.server.store.PoolManager;
import com.server.store.data.ApporteurManager;
import com.server.store.data.AssureManager;
import com.server.store.data.InterlocuteurManager;
import com.server.store.data.PropositionManager;
import com.shared.context.User;
import com.shared.data.TypeIData;
import com.shared.model.Apporteur;
import com.shared.model.Assure;
import com.shared.model.Interlocuteur;
import com.shared.model.Produit;
import com.shared.model.Proposition;
/**
 * Implémentation du service de gestion des {@link Assure}
 * @author queyroi
 *
 */
@SuppressWarnings("serial")
public class AssureDataServiceImpl extends RemoteServiceServlet implements AssureDataService{

        public Assure delete(Assure assure) throws IllegalArgumentException{
                checkInput(assure);
                checkCurrentIsAdministrator();
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).delete(assure);
                return assure;          
        }

        public List  getList() throws IllegalArgumentException{                 
                checkCurrentIsAdministrator();
                List<Assure> liste = ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).getList();
                return liste;
        }

        public Assure save(Assure assure) throws IllegalArgumentException{
                checkInput(assure);
                checkCurrentIsAdministrator();
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).save(assure);               
                return assure;          
        }

        public Assure update(Assure assure) throws IllegalArgumentException{
        		checkAllow(assure);
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return assure;          
        }

        
        
        public void checkInput(Object obj) throws IllegalArgumentException{
                if(obj==null) throw new IllegalArgumentException("Echec d'enregistrement : vérifier les paramètres");
        }
        
        public void checkCurrentIsAdministrator() throws IllegalArgumentException{
                if(!((User) getThreadLocalRequest().getSession().getAttribute("user")).isAdministrator()) throw new IllegalArgumentException("Seul un administrateur est autorisé à réalisé cette opération");
        }

        public List getListProposition(Assure assure) throws IllegalArgumentException {         
                checkAllow(assure);                  
                try {
                        return ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).getListProposition(assure);
                } catch (EntityNotFoundException e) {                	
                        throw new IllegalArgumentException("Erreur lors de la requete.");
                }               
        }

        
        public Apporteur getApporteur(Assure assure)
                        throws IllegalArgumentException {
                checkAllow(assure);
                if(assure.getKeyApporteur()==null) throw new IllegalArgumentException("Pas d'apporteur enregistre");    
                try{
                        return ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).getApporteur(assure);
                }catch (EntityNotFoundException e) {                	
                        throw new IllegalArgumentException("Erreur lors de la requete.");
                }       
        }

        
        public Interlocuteur getGestionnaire(Assure assure)
                        throws IllegalArgumentException {
                checkAllow(assure);
                if(assure.getKeyGestionnaire()==null) throw new IllegalArgumentException("Pas de gestionnaire enregistre");     
                try{
                        return ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).getGestionnaire(assure);
                }catch (EntityNotFoundException e) {
                        throw new IllegalArgumentException("Erreur lors de la requete.");
                }       
        }

        
        public Apporteur getSousApporteur(Assure assure)
                        throws IllegalArgumentException {
                checkAllow(assure);
                if(assure.getKeySousApporteur()==null) throw new IllegalArgumentException("Pas de sousapporteur enregistre");   
                try{
                        return ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).getSousApporteur(assure);
                }catch (EntityNotFoundException e) {
                	
                        throw new IllegalArgumentException("Erreur lors de la requete.");
                }       
        }

        
        public String setApporteur(Assure assure, Apporteur apporteur)
                        throws IllegalArgumentException {
                checkCurrentIsAdministrator();
                if(assure==null && apporteur==null) throw new IllegalArgumentException("Erreur dans l'enregistrement, verfier les entreés");
                ((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).save(apporteur);
                assure.setApporteur(apporteur);
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return "sucess";
        }

        
        public String setGestionnaire(Assure assure, Interlocuteur interlocuteur)
                        throws IllegalArgumentException {
                checkCurrentIsAdministrator();
                if(assure==null && interlocuteur==null) throw new IllegalArgumentException("Erreur dans l'enregistrement, verfier les entreés");
                ((InterlocuteurManager) PoolManager.get().getDataManager(TypeIData.INTERLOCUTEUR)).save(interlocuteur);
                assure.setGestionnaire(interlocuteur);
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return "sucess";
        }

        
        public String setSousApporteur(Assure assure, Apporteur apporteur)
                        throws IllegalArgumentException {
                checkCurrentIsAdministrator();
                if(assure==null && apporteur==null) throw new IllegalArgumentException("Erreur dans l'enregistrement, verfier les entreés");
                ((ApporteurManager) PoolManager.get().getDataManager(TypeIData.APPORTEUR)).save(apporteur);
                assure.setSousApporteur(apporteur);
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return "sucess";
        }

        
        public String addProposition(Assure assure, Proposition proposition)
                        throws IllegalArgumentException {
                checkCurrentIsAdministrator();
                if(assure==null && proposition==null) throw new IllegalArgumentException("Erreur dans l'enregistrement, verfier les entreés");
                ((PropositionManager) PoolManager.get().getDataManager(TypeIData.PROPOSITION)).save(proposition);
                assure.addProposition(proposition);
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return "sucess";
        }
        
       public String acceptProposition(Assure assure,Proposition proposition){
    	   checkAllow(assure);
    	   proposition.setAccepted(true);
    	   ((PropositionManager) PoolManager.get().getDataManager(TypeIData.PROPOSITION)).update(proposition);
    	   return "sucess";
       }
       
       
        public Produit getProduitPropose(Assure assure,Proposition proposition){
        	checkAllow(assure);
        	try{
        		return ((PropositionManager) PoolManager.get().getDataManager(TypeIData.PROPOSITION)).getProduit(proposition);
        	}catch(EntityNotFoundException e){
        		return null;
        	}
        }

        
        public String removeProposition(Assure assure, Proposition proposition) throws IllegalArgumentException {
                if(assure==null && proposition==null) throw new IllegalArgumentException("Erreur: verfier les entreés");                
                assure.removeProposition(proposition);
                ((PropositionManager) PoolManager.get().getDataManager(TypeIData.PROPOSITION)).delete(proposition);              
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return "sucess";
        }
        
        public void checkAllow(Assure assure) throws IllegalArgumentException {
                if(!(((User) getThreadLocalRequest().getSession().getAttribute("user")).isAdministrator() ||
                ((User) getThreadLocalRequest().getSession().getAttribute("user")).getKeyAssure().getId() == assure.getKey())) 
                        throw new IllegalArgumentException("Vous n'etes pas autorisé à réaliser cette opération");              
        }

        public String removeApporteur(Assure assure, Apporteur apporteur)       throws IllegalArgumentException {
                checkCurrentIsAdministrator();
                checkInput(apporteur);
                checkInput(assure);             
                assure.setApporteur(null);
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return "sucess";
        }

        public String removeApporteurGestionnaire(Assure assure,Interlocuteur interlocuteur) throws IllegalArgumentException {
                checkCurrentIsAdministrator();
                checkInput(interlocuteur);
                checkInput(assure);
                assure.setGestionnaire(null);
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return "sucess";
        }

        public String removeApporteurSousApporteur(Assure assure,Apporteur apporteur) throws IllegalArgumentException {
                checkCurrentIsAdministrator();
                checkInput(apporteur);
                checkInput(assure);
                assure.setSousApporteur(null);
                ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).update(assure);
                return "sucess";
        }

		public Assure getAssure(long key) throws IllegalArgumentException {
			checkInput(key);
			 if((((User) getThreadLocalRequest().getSession().getAttribute("user")).isAdministrator() ||
		                ((User) getThreadLocalRequest().getSession().getAttribute("user")).getKeyAssure().getId() == key)){
				 for(Assure a : ((AssureManager) PoolManager.get().getDataManager(TypeIData.ASSURE)).getList()){
					 if(a.getKey()==key) return a;
				 }
			 }else{
				 throw new IllegalArgumentException("Vous n'etes pas autorisé à réaliser cette opération");     
			 }
			return null;
		}
        

}
